import pymysql
import os
import sys
from dbutils.pooled_db import PooledDB

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)
from database import DATABASE


# 数据库连接编码
DB_CHARSET = "utf8"

# mincached : 启动时开启的闲置连接数量(缺省值 0 开始时不创建连接)
DB_MIN_CACHED = 3

# maxcached : 连接池中允许的闲置的最多连接数量(缺省值 0 代表不闲置连接池大小)
DB_MAX_CACHED = 5

# maxshared : 共享连接数允许的最大数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用
DB_MAX_SHARED = 10

# maxconnecyions : 创建连接池的最大数量(缺省值 0 代表不限制)
DB_MAX_CONNECYIONS = 30

# blocking : 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......> 其他代表阻塞直到连接数减少,连接被分配)
DB_BLOCKING = True

# maxusage : 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开)
DB_MAX_USAGE = 0

# setsession : 一个可选的SQL命令列表用于准备每个会话，如["set datestyle to german", ...]
DB_SET_SESSION = None

# creator : 使用连接数据库的模块
DB_CREATOR = pymysql


class MyConnectionPool(object):
    __pool = None

    def __new__(cls, user_data ,*args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(MyConnectionPool, cls).__new__(cls, *args, **kwargs)
        cls.user_data = user_data
        return cls._instance

    # 创建数据库连接池
    def _getconn(self):
        if self.__pool is None:
            self.__pool = PooledDB(
                creator=DB_CREATOR,
                mincached=DB_MIN_CACHED,
                maxcached=DB_MAX_CACHED,
                maxshared=DB_MAX_SHARED,
                maxconnections=DB_MAX_CONNECYIONS,
                blocking=DB_BLOCKING,
                maxusage=DB_MAX_USAGE,
                setsession=DB_SET_SESSION,
                host=self.user_data['host'],
                port=self.user_data['port'],
                user=self.user_data['user'],
                passwd=self.user_data['password'],
                db=self.user_data['database'],
                use_unicode=True,
                charset=DB_CHARSET
            )
        return self.__pool

# 获取连接池,实例化
def get_connection(user_data):
    con_obj = MyConnectionPool(user_data)
    print('connection pool obj ID：： %s' % id(con_obj))
    pool_conn = con_obj._getconn()
    print('db connection success......')
    return pool_conn

if __name__ == '__main__':
    get_connection(DATABASE['yanwei'])
